package com.artisan.springuitls.demos;

import org.springframework.stereotype.Component;
import org.springframework.util.Assert;

import java.util.Collections;

/**
 * Assert 工具类演示
 * 功能：参数校验断言大师
 * 优势：比 if-throw 更简洁，错误消息清晰
 */
@Component
public class AssertDemo {

    /**
     * 场景：接口入参校验（ID 不能为空）
     */
    public void cancelOrder(Long orderId) {
        System.out.println("\n========== Assert Demo ==========");
        
        // ✅ 一行校验：失败抛 IllegalArgumentException
        Assert.notNull(orderId, "订单ID不能为空");
        
        System.out.println("取消订单: " + orderId);
    }

    /**
     * 演示更多断言方法
     */
    public void demonstrateMoreAssertions() {
        System.out.println("\n--- 各种断言方法 ---");
        
        // 字符串断言
        String name = "张三";
        Assert.hasText(name, "姓名不能为空");
        Assert.hasLength(name, "姓名长度不能为0");
        System.out.println("✓ 字符串断言通过");
        
        // 集合断言
        Assert.notEmpty(Collections.singletonList("item"), "集合不能为空");
        System.out.println("✓ 集合断言通过");
        
        // 布尔断言
        int age = 25;
        Assert.isTrue(age >= 18, "年龄必须大于等于18岁");
        System.out.println("✓ 布尔断言通过");
        
        // 状态值断言（使用 Lambda 延迟计算消息）
        int status = 3;
        Assert.isTrue(status > 0 && status <= 5, 
            () -> "状态值非法: " + status + "，必须为 1-5");
        System.out.println("✓ 状态断言通过");
        
        // 对象类型断言
        Object obj = "test";
        Assert.isInstanceOf(String.class, obj, "对象必须是 String 类型");
        System.out.println("✓ 类型断言通过");
        
        // 对象赋值断言
        Assert.isAssignable(CharSequence.class, String.class, "String 必须可赋值给 CharSequence");
        System.out.println("✓ 赋值断言通过");
        
        // 空值断言
        Object nullObj = null;
        Assert.isNull(nullObj, "对象必须为 null");
        System.out.println("✓ 空值断言通过");
        
        // 数组断言
        String[] array = {"a", "b", "c"};
        Assert.notEmpty(array, "数组不能为空");
        Assert.noNullElements(array, "数组不能包含 null 元素");
        System.out.println("✓ 数组断言通过");
        
        System.out.println("==========================================\n");
    }

    /**
     * 演示断言失败场景
     */
    public void demonstrateAssertionFailure() {
        try {
            Assert.notNull(null, "这里会抛出异常");
        } catch (IllegalArgumentException e) {
            System.out.println("捕获到断言异常: " + e.getMessage());
        }
    }
}

